package code16_thread;

public class Test08 {

	public static void main(String[] args) {
		// 共同的仓库
		ProductStore ps = new ProductStore();
		
		Producer p1 = new Producer("p1", ps);
		Producer p2 = new Producer("p2", ps);
		Producer p3 = new Producer("p3", ps);
		p1.setPriority(Thread.MIN_PRIORITY);// 默认为5， 范围 1~10
		p2.setPriority(Thread.MAX_PRIORITY);
		
		p1.start();
		p2.start();
//		p3.start();
		
		Consumer c1 = new Consumer("c1", ps);
		Consumer c2 = new Consumer("c2", ps);
		
		c1.start();
		c2.start();
		
	}
	
}
// 仓库
class ProductStore {
	/**
	 * 仓库的上限
	 */
	private static final int MAX_NUM = 10;
	/**
	 * 当前存放的商品数量
	 */
	private int num;
	/**
	 * 存入一个商品
	 */
	public void put() {
		num++;
	}
	/**
	 * 取出一个商品
	 */
	public void get() {
		num--;
	}
	/**
	 * 库存
	 * @return
	 */
	public int getNum() {
		return num;
	}
	/**
	 * 是否满了
	 * @return
	 */
	public boolean isFull() {
		return num == MAX_NUM;
	}
	/**
	 * 是否空了
	 * @return
	 */
	public boolean isEmpty() {
		return num == 0;
	}
}

class Producer extends Thread {
	private String name;// 名称
	private ProductStore ps;// 存放商品的仓库
	public Producer(String name, ProductStore ps) {
		this.name = name;
		this.ps = ps;
	}
	@Override
	public void run() {
		// 一直生产商品
		while(true) {
			synchronized (ps) {// 使用不变的(共用的)仓库
				if (ps.isFull()) {
					// 满了, 唤醒消费者, 等待
					ps.notifyAll();
					System.out.println("生产者["+name+"]发现仓库已 满, 唤醒其他");
					try {
						ps.wait();
						System.out.println("生产者["+name+"]被唤醒...");
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				} else {
					// 未满, 生产商品
					ps.put();
					System.out.println("生产者["+name+"]生产了一个商品,库存:"+ps.getNum());
				}
			}
			// 每生产一个商品休息一下
			try {
				Thread.sleep(400);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
}

class Consumer extends Thread {
	private String name;// 名称
	private ProductStore ps;// 取商品的仓库
	public Consumer(String name, ProductStore ps) {
		this.name = name;
		this.ps = ps;
	}
	@Override
	public void run() {
		// 一直消费商品
		while(true) {
			synchronized (ps) {// 使用不变的(共用的)仓库
				if (ps.isEmpty()) {
					// 空了, 唤醒生产者, 等待
					ps.notifyAll();
					System.out.println("消费者["+name+"]发现仓库已 空, 唤醒其他");
					try {
						ps.wait();
						System.out.println("消费者["+name+"]被唤醒...");
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				} else {
					// 未空, 消费商品
					ps.get();
					System.out.println("消费者["+name+"]消费了一个商品,库存:"+ps.getNum());
				}
			}
			// 每消费一个商品休息一下
			try {
				Thread.sleep(400);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
}
